package cn.dlc.com.sys.config.datasource;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.List;

/**
 * @Author: dlc
 * @Date: 2021/12/4 - 10:16
 */
@Component
@Aspect
// 指定优先级，值越低优先级越高
@Order(-9999)
public class DataSourceAspect {

    // 拦截所有 service 里面的方法
    @Before("execution(* cn.dlc.com..service.impl.*.*(..))")
    public void beforeExecution(JoinPoint joinPoint) {
        // 获取到拦截的方法
        String methodName = joinPoint.getSignature().getName();
        System.out.println("拦截的方法是----->" + methodName);

        for (String key : ChooseDataSource.METHOD_TYPE_MAP.keySet()) {
            // 获取当前不同的 DataSource
            List<String> methodTypeList = ChooseDataSource.METHOD_TYPE_MAP.get(key);

            for (String methodType : methodTypeList) {
                if(methodName.startsWith(methodType)){
                    // 将获取到的 datasource 放入 DataSourceHandler
                    DataSourceHandler.putDataSource(key);
                    break;
                }
            }
        }
    }
}
